package com.kelp.codetoolkit.respository

import com.intellij.psi.PsiMethod
import com.kelp.codetoolkit.entity.CallerPosition

/**
 * @author: liuyuebai
 * @date: 2025/8/10 11:47
 * @description:
 */
object CallerHistoryManager {
    // 存储方法与最后调用位置的映射
    private val methodCallerMap = mutableMapOf<PsiMethod, CallerPosition>()
    // 记录插入顺序（用LinkedHashSet保持插入顺序）
    private val insertionOrder = LinkedHashSet<PsiMethod>()
    // 最大存储数量
    private const val MAX_SIZE = 2

    /**
     * 记录方法调用位置
     */
    fun recordCaller(method: PsiMethod, position: CallerPosition) {
        // 先移除已有记录（保证新记录是最新的）
        if (methodCallerMap.containsKey(method)) {
            insertionOrder.remove(method)
        }

        // 添加新记录
        methodCallerMap[method] = position
        insertionOrder.add(method)

        // 超过最大数量时，移除最早添加的记录
        if (insertionOrder.size > MAX_SIZE) {
            val oldestMethod = insertionOrder.iterator().next() // 获取最早的元素
            insertionOrder.remove(oldestMethod)
            methodCallerMap.remove(oldestMethod)
        }
    }

    /**
     * 获取方法的最后调用位置
     */
    fun getLastCaller(method: PsiMethod): CallerPosition? {
        return methodCallerMap[method]
    }

    /**
     * 清除指定方法的调用记录
     */
    fun clearCaller(method: PsiMethod) {
        methodCallerMap.remove(method)
        insertionOrder.remove(method)
    }

    /**
     * 清除所有记录（可选）
     */
    fun clearAll() {
        methodCallerMap.clear()
        insertionOrder.clear()
    }
}